/** 列表进出类 */
export default class TranstionList<T> {

	/** 列表字典 */
	private setMap = {
		enter: new Set<T>(),
		update: new Set<T>(),
		remove: new Set<T>(),
	}

	/** 进入列表 */
	public get Enter() {
		return Array.from(this.setMap.enter);
	}

	/** 更新列表 */
	public get Update() {
		return Array.from(this.setMap.update);
	}

	/** 移除列表 */
	public get Remove() {
		return Array.from(this.setMap.remove);
	}

	/** 清空 */
	public Clear(): void {
		const { enter, update, remove } = this.setMap;
		enter.clear();
		update.clear();
		remove.clear();
	}

	/**
	 * 添加数据
	 * @param list 要添加的数据
	 */
	public Push(list: T[]): void {
		const { enter, update, remove } = this.setMap;
		enter.forEach(value => {
			update.add(value);
		});
		enter.clear();
		remove.clear();
		list.forEach(value => {
			if (!update.has(value)) {
				enter.add(value);
			}
		});
		update.forEach(value => {
			if (!list.includes(value)) {
				update.delete(value);
				remove.add(value);
			}
		});
	}
}
